/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package userservercontroller;

import Network.IModeWork;
import autorization.IAutorization;
import autorization.IRolesTable;
import autorization.OSUsers;
import autorization.RegistrationFailed;
import autorization.Role;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import messagemanager.JMessage;
import messagemanager.JMessageManager;
import mpiserver.IMpiServer;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;
import repository.ByteArray;
import repository.IRepository;
import repository.RepositoryParams;
import repository.exception.*;
import taskmanager.JTask;
import taskmanager.ITaskManager;

/**
 * @author ID=1008, Ustinov
 * @author ID=1001, Volk
 * @author ID = 2001, Aleksey
 * @author ID = 2009, TrueWar
 */
public class UserServerController implements IUserServerController {
    private IAutorization autorizationTable;
    private IRolesTable rolesTable;
    private IRepository repository;
    private IMpiServer mpiserver;
    private ITaskManager taskmanager;
    private NetworkTable networkTable = new NetworkTable();
    private JMessageManager messageManager;


    /**
     * Констркутор КУС-а с параметрами
     * @param PAutorizationTable - интрефей таблицы авторизации.
     * @param PRolesTable - интерфейс таблицы ролей.
     */
    public UserServerController(IAutorization PAutorizationTable, 
            IRolesTable PRolesTable, IRepository PRepository,
            IMpiServer PMpiServer,ITaskManager PTaskmanager, JMessageManager messageManager) {
        autorizationTable = PAutorizationTable;
        rolesTable = PRolesTable;
        repository = PRepository;
        mpiserver=PMpiServer;
        taskmanager=PTaskmanager;
        this.messageManager = messageManager;
    }

    /**
     * Принудительно отключить всех пользователей из системы
     */
    public void disconnectAll(){
     networkTable.clear();
    }

    /**
     * Запросить у сервера факт накопленных сообщений
     * @param autorizationKey - авторизационный ключ пользователя
     * @return 0 - авторизован, сообщений нет
     *         1 - авторизован, есть сообщения
     *        -1 - не авторизован
     * @throws java.rmi.RemoteException - разрыв соединения с сервером
     */
     
    public long pingLastOperationStatus(long autorizationKey) throws RemoteException {
        
        if(networkTable.ping(autorizationKey)){          
          //Проверка есть ли сообщения
           //Получаем идентификатор пользователя
            int ID = (int)networkTable.getID(autorizationKey);
            if(messageManager.isMessageExists(ID)) return 1;
          //------------------------
          return 0;
        }else return -1;
    }


    /**
     * Получить сообщений от сервера
     * @param autorizationKey  авторизационный ключ
     * @return список сообщений от сервера
     * @throws java.rmi.RemoteException ошибка соединения
     */
    public LinkedList<JMessage> getMessageList(long autorizationKey) throws RemoteException{
     System.out.println("Пользователь запросил свой сообщения");
     int ID = (int)networkTable.getID(autorizationKey);
     try{
     return messageManager.getMessages(ID);
     }catch(Exception e){return null;}
    }


    /**
     * Получить кандидата в арбитры
     * @return null - арбитраж не поддерживается, или имя кандидата
     * @throws java.rmi.RemoteException  - ошибка соединения
     */
    public String getCandidateIP() throws RemoteException {
        return null;
    }

    /**
     * Получить все сообщения от сервера
     * @return сообщения от сервера
     * @throws java.rmi.RemoteException - оишибка соединения
    */
    public String getServerAnswer() throws RemoteException {
        return null;
    }

    /** Попытка регистрация на сервере.
     * @param login - имя учётной записи
     * @param password - пароль пользователя
     * @return - возвращается авторизационный ключ.
     * @throws RegistrationFailed - возвращается в случае, если регистрация по какой-либо причине невозможна.
     * @throws RemoteException - если произошла ошибка соединения
    */
    public long tryRegistration(String login, String password) throws RemoteException, RegistrationFailed {
        try {
            long ID = autorizationTable.Registration(login, password, rolesTable.findRole("User").getID());
            //создать репозиторий (ТЕСТОВАЯ)
            try {
                repository.createRepository(ID);
                repository.saveRepositoryData();
            } catch (RepositoryException ex) {}
            //создать пользователя ОС (тестовая)
            OSUsers osUsers=OSUsers.getInstance();
            osUsers.createUser(ID);
            osUsers.registerInMpi(ID);
            return networkTable.addAuthorizationKey(ID);
        } catch (IOException ex) {
            return -1;
        }
    }

    /** Попытка авторизации на сервере
     * @param login - имя учётной записи
     * @param password - пароль пользователя
     * @return - авторизационный ключ, если авторизация прошла успешно, 
     * значение -1 ошибка авторизации, -2 пользователь уже авторизован
     * @throws RemoteException - если произошла ошибка соединения
    */
    public long tryAuthorization(String login, String password) throws RemoteException{
        try {
            long ID = autorizationTable.getID(login, password);
            if (networkTable.authorizedID(ID)) {
             return -2;
            }
            //Тестирование-------------------
            messageManager.addMessage((int)ID,new JMessage(0, "Test 1"));
            messageManager.addMessage((int)ID, new JMessage(0, "Тест 2"));
            //-------------------------------
            return networkTable.addAuthorizationKey(ID);
        } catch (RegistrationFailed ex) {
            return -1;
        }
    }

     /** �?зменение пароля к учётной записи
     * @param authorizationKey - ключ авторизации, полученный либо при регистрации, либо при авторизации на сервере.
     * @param OldPassword - старый пароль пользователя
     * @param NewPassword - новый пароль.
     * @return - возвращается true, если пароль успешно изменён, false - иначе.
     * @throws RegistrationFailed - если старые входные параметры не соответствуют хранящимся в базе сервера.
     */
    public boolean modifyMyPassword(long authorizationKey, String NewPassword) throws RegistrationFailed, RemoteException {
        try {
            long ID = networkTable.getID(authorizationKey);
            if(ID == -1) return false;
            autorizationTable.modifyPassword(ID, NewPassword);
            return true;
        } catch (IOException ex) {
            //Пока что данное исключение никак не обрабатывается
        }
        return false;
    }

    /**
     * �?зменение имени учётной записи
     * @param authorizationKey - ключ авторизации, полученный либо при регистрации, либо при авторизации на сервере.
     * @param NewLogin - новый логин
     * @return
     * @throws autorization.RegistrationFailed
     * @throws java.rmi.RemoteException
     */
    public boolean modifyMyLogin(long authorizationKey, String NewLogin) throws RegistrationFailed, RemoteException {
        try {
          long ID = networkTable.getID(authorizationKey);
          if(ID == -1) return false;
          autorizationTable.modifyLogin(ID, NewLogin);
          return true;

        } catch (IOException ex) {
            //Пока что данное исключение никак не обрабатывается
        }
        return false;
    }


    /** Получение роли своего логина
     * @param authorizationKey
     * @param login
     * @return
     * @throws java.rmi.RemoteException
     */
    public String getMyRole(long authorizationKey) throws RemoteException {
        long ID = networkTable.getID(authorizationKey);
        long IDRoles = autorizationTable.getRole(ID);
        Role role = rolesTable.findRole(IDRoles);
        return role.getName();
    }

     /**
     * Удалить свою учётную запись из таблицы
     * @param authorizationKey - авторизационный ключ
     * @return true - в случае успеха, false в случае некорректности авторизационного ключа
     * @throws java.rmi.RemoteException  - ошибка соединения
     * @throws autorization.RegistrationFailed - неверный авторизационный ключ
     */
    public boolean unregistration(long authorizationKey) throws RemoteException, RegistrationFailed {
        long ID = networkTable.getID(authorizationKey); 
        if(ID == -1) return false; 
        networkTable.deleteKey(authorizationKey);
        try{
         autorizationTable.unregistration(ID);
         //удалить пользователя ОС
         OSUsers osUsers=OSUsers.getInstance();
         osUsers.removeUser(ID);
        }catch(IOException ioe){}
        return true;
    }

    public boolean logoff(long authorizationKey) throws RemoteException {
        boolean result = false;
        int ID = (int)networkTable.getID(authorizationKey);
        result = networkTable.deleteKey(authorizationKey);
        //Тестирование-------------------
        if(result){
        messageManager.addMessage((int)ID,new JMessage(0, "Тест 3"));
        messageManager.addMessage((int)ID, new JMessage(0, "Тест 4"));
        //-------------------------------
        }
        return result;
    }

    /**
     * Запросить файлы и директории репозитория лежащие в папке relativePath
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория
     * @return вектор имен файлов
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    @Override
    public Vector<String> getFiles (long authorizationKey,String relativePath)
            throws RemoteException,WrongKeyExeption {    
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        //System.out.println("REPOSITORY: user "+key+" get files from "+relativePath);
        try {      
            //вернуть вестор файлов
            Vector<String> v = new Vector<String>();
            for(String s:repository.getFiles(key, relativePath))v.add(s);
            return v;
        } catch (NullRootException ex) {
            return null;
        } catch (NoRepositoryException ex) {
            return null;
        }
    }

    /**
     * Запросить файлы и директории репозитория лежащие в папке relativePath
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория
     * @param filter фильтр файлов
     * @return вектор имен файлов
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    @Override
    public Vector<String> getFiles (long authorizationKey, String relativePath,
            FilenameFilter filter) throws RemoteException,WrongKeyExeption {
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        //System.out.println("REPOSITORY: user "+key+" get files from "+relativePath);
        try {
            //вернуть вестор файлов
            Vector<String> v = new Vector<String>();
            for(String s:repository.getFiles(key, relativePath,filter))v.add(s);
            return v;
        } catch (NullRootException ex) {
            return null;
        } catch (NoRepositoryException ex) {
            return null;
        }
    }

    /**
     * Запросить файлы и директории репозитория лежащие в папке relativePath
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория
     * @param filter фильтр файлов
     * @return массив файлов
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    /*@Override
    public Vector<File> getFiles (long authorizationKey, String relativePath,
            FileFilter filter) throws RemoteException,WrongKeyExeption {
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        System.out.println("REPOSITORY: user "+key+" get files from "+relativePath);
        try {
            //вернуть вестор файлов
            Vector<File> v = new Vector<File>();
            for(File f:repository.getFiles(key, relativePath,filter))v.add(f);
            return v;
        } catch (NullRootException ex) {
            return null;
        } catch (NoRepositoryException ex) {
            return null;
        }
    }*/

    /**
     * Запросить файл репозитория
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория
     * @param filter фильтр файлов
     * @return файл
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    /*@Override
    public File getFile (long authorizationKey, String relativePath)
           throws RemoteException,WrongKeyExeption {
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        System.out.println("REPOSITORY: user "+key+" get file "+relativePath);
        try {
            return repository.getFile(key, relativePath);
        } catch (NullRootException ex) {
            return null;
        } catch (NoRepositoryException ex) {
            return null;
        }
    }*/

    /**
     * Скачать файл
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @return массив байт, если файла не существует или
     * relativePath - директория возвращает null;
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     * @throws java.io.IOException ошибка чтения файла
     */
    @Override
    public ByteArray downloadFile (long authorizationKey,String relativePath)
            throws IOException,RemoteException,WrongKeyExeption {
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        //System.out.println("REPOSITORY: user "+key+" download file "+relativePath);
        try {
            return repository.downloadFile(key, relativePath);
        } catch (NullRootException ex) {
            return null;
        } catch (NoRepositoryException ex) {
            return null;
        }
    }

    /**
     * Загрузить файл в репозиторий
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @param array массив байт
     * @return true в случае успеха, иначе false
     * @throws java.io.IOException ошибка чтения файла
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     * @throws repository.exception.FileSizeException превышен размер файла
     * @throws repository.exception.RepositorySizeException превышен размер репозитория
     */
    public boolean uploadFile(long authorizationKey,String relativePath,
            ByteArray array) throws IOException,RemoteException,
            WrongKeyExeption,FileSizeException,RepositorySizeException {
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        //System.out.println("REPOSITORY: user "+key+" upload file "+relativePath);
        try {
            return repository.uploadFile(key, relativePath,array);
        } catch (NullRootException ex) {
            return false;
        } catch (NoRepositoryException ex) {
            return false;
        }
    }

    /**
     * Проверить явяется ли файл с заданным именем директорией
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @return true если директория
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    @Override
    public boolean isDirectory(long authorizationKey,String relativePath)
            throws RemoteException,WrongKeyExeption {
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        //System.out.println("REPOSITORY: user "+key+" check file "+relativePath);
        try {
            return repository.isDirectory(key, relativePath);
        } catch (NullRootException ex) {
            return false;
        } catch (NoRepositoryException ex) {
            return false;
        }
    }

    /**
     * Добавить файл в репозиторий
     * @param authorizationKey авторизационный ключ
     * @param file добавляемый файл
     * @param relativePath путь относительно репозитория пользователя
     * @return true - файл создан, false - файл с таким именем уже существует
     * @throws IOException ошибка ввода/вывода при копировании файла
     * @throws FileSizeException превышен размер файла
     * @throws RepositorySizeException превышен размер репозитория
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    /*@Override
    public boolean createFile (long authorizationKey, File file, String relativePath)
            throws RemoteException,WrongKeyExeption, IOException,
            FileSizeException,RepositorySizeException{
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        System.out.println("REPOSITORY: user "+key+" create file "+relativePath);
        try {
            return repository.createFile(key,file,relativePath);
        } catch (NullRootException ex) {
            return false;
        } catch (NoRepositoryException ex) {
            return false;
        }
    }*/

    /**
     * Создать папку в директории репозитория
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @return true - файл создан, false - файл с таким именем уже существует
     * @throws java.rmi.RemoteException если произошла ошибка соединения
     * @throws java.io.IOException ошибка ввода/вывода при создании директории
     * @throws WrongKeyExeption неверный ключ
     */
    @Override
    public boolean createDirectory (long authorizationKey, String relativePath)
            throws RemoteException,WrongKeyExeption, IOException {
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        //System.out.println("REPOSITORY: user "+key+" create directory "+relativePath);
        try {
            return repository.createDirectory(key, relativePath);
        } catch (NullRootException ex) {
            return false;
        } catch (NoRepositoryException ex) {
            return false;
        }
    }

    /**
     * Удалить файл или директорию из репозитория.
     * Для удаления директории она должна быть пуста.
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь к файлу относительно репозитория
     * @return true - успешное удаление, false в противном случае
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    @Override
    public boolean deleteFile (long authorizationKey, String relativePath)
            throws RemoteException,WrongKeyExeption{
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        //System.out.println("REPOSITORY: user "+key+" delete file "+relativePath);
        try {
            return repository.deleteFile(key, relativePath);
        } catch (NullRootException ex) {
            return false;
        } catch (NoRepositoryException ex) {
            return false;
        }
    }

    /**
     * Удалить файл или директорию из репозитория.
     * В случае удаления директории удяляется и её содержимое.
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь к файлу относительно репозитория
     * @return true - успешное удаление, false в противном случае
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    @Override
    public boolean recurrenceDelete (long authorizationKey, String relativePath)
            throws RemoteException,WrongKeyExeption{
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        //System.out.println("REPOSITORY: user "+key+" delete files from "+relativePath);
        try {
            return repository.recurrenceDelete(key, relativePath);
        } catch (NullRootException ex) {
            return false;
        } catch (NoRepositoryException ex) {
            return false;
        }
    }

    /**
     * Обновить файл репозитория
     * @param authorizationKey авторизационный ключ
     * @param file файл-источник
     * @param relativePath путь назначения относительно репозитория пользователя
     * @throws IOException ошибка ввода/вывода при копировании файла
     * @throws FileSizeException превышен размер файла
     * @throws RepositorySizeException превышен размер репозитория
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    /*@Override
    public void updateFile (long authorizationKey, File file, String relativePath)
            throws RemoteException,WrongKeyExeption, IOException,
            FileSizeException,RepositorySizeException{
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        System.out.println("REPOSITORY: user "+key+" update file "+relativePath);
        try {
            repository.updateFile(key,file, relativePath);
        } catch (NullRootException ex) {

        } catch (NoRepositoryException ex) {

        }
    }*/

    /**
     * Переименовать файл. Можно использовать для перемещения файла
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @param newRelativePath новый путь относительно репозитория пользователя
     * @return true в случае успеха, иначе false
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    @Override
    public boolean renameFile(long authorizationKey, String relativePath,
            String newRelativePath) throws RemoteException,WrongKeyExeption{
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        //System.out.println("REPOSITORY: user "+key+" rename files "
        //        +relativePath + " to " + newRelativePath);
        try {
            return repository.renameFile(key,relativePath,newRelativePath);
        } catch (NullRootException ex) {
            return false;
        } catch (NoRepositoryException ex) {
            return false;
        }
    }

    /**
     * Провенрить существование файла или директории
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @return true в случае успеха, иначе false
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    @Override
    public boolean exist(long authorizationKey, String relativePath)
            throws RemoteException,WrongKeyExeption{
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        //System.out.println("REPOSITORY: user "+key+" check exist file "+relativePath);
        try {
            return repository.exist(key, relativePath);
        } catch (NullRootException ex) {
            return false;
        } catch (NoRepositoryException ex) {
            return false;
        }
    }

    /**
     * запросить время последней модификации файла
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @return время в миллисекундах с 1970. в случае внутренней ошибки -1
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    @Override
    public long lastModified(long authorizationKey, String relativePath)
            throws RemoteException,WrongKeyExeption{
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        //System.out.println("REPOSITORY: user "+key+" check lastModified file "+relativePath);
        try {
            return repository.lastModified(key, relativePath);
        } catch (NullRootException ex) {
            return -1;
        } catch (NoRepositoryException ex) {
            return -1;
        }
    }

    /**
     * Запросить количество файлов в папке и подпапках
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @return число файлов в папке и подпапках. -1 если на relativePath не
     * существует или является файлом
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    @Override
    public int getFilesNumber(long authorizationKey, String relativePath)
            throws RemoteException,WrongKeyExeption{
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        try {
            return repository.getFilesNumber(key, relativePath) ;
        } catch (NullRootException ex) {
            return -1;
        } catch (NoRepositoryException ex) {
            return -1;
        }
    }

    /**
     * запросить размер файла или директории
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @return размер файла или директории в байтах. -1 в случае ошибки
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    @Override
    public long getSize(long authorizationKey, String relativePath)
            throws RemoteException,WrongKeyExeption{
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        try {
            return repository.getSize(key, relativePath) ;
        } catch (NullRootException ex) {
            return -1;
        } catch (NoRepositoryException ex) {
            return -1;
        }
    }

    /**
     * Запросить размер репозитория
     * @param authorizationKey авторизационный ключ
     * @return размер репозитория в байтах. -1 в случае ошибки
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    @Override
    public long getRepositorySize(long authorizationKey) 
            throws RemoteException,WrongKeyExeption {
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        try {
            return repository.getRepositorySize(key);
        } catch (NullRootException ex) {
            return -1;
        } catch (NoRepositoryException ex) {
            return -1;
        }
    }

    /**
     * Запросить максимальный размер файла репозитория
     * @param authorizationKey авторизационный ключ
     * @return размер в байтах
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    @Override
    public long getMaxFileSize (long authorizationKey) 
            throws RemoteException,WrongKeyExeption {
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        try {
            return repository.getRepositoryParams(key).getMaxFileSize();
        } catch (RepositoryException ex) {
            return -1;
        }
    }

    /**
     * Запросить максимальный размер репозитория
     * @param authorizationKey авторизационный ключ
     * @return размер в байтах
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    @Override
    public long getMaxSize (long authorizationKey) 
            throws RemoteException,WrongKeyExeption{
        long key=networkTable.getID(authorizationKey);
        if(key<0) throw new WrongKeyExeption("Wrong authorizationKey");
        try {
            return repository.getRepositoryParams(key).getMaxSize();
        } catch (RepositoryException ex) {
            return -1;
        }
    }

	// -Добавлено 02.04.09, TrueWar (id 2009)-----------------------------------
    /**
     * Добавление задачи.
     * В случае, если включена автоподача задач, очередная задача пойдет на
     * исполнение.
	 * @param authorizationKey пользователя
     * @param isCompil true - компилировать перед исполнением, false - исполнять
     * @param startFile основной файл исходников или исполняемый файл
     * @param attachedFiles список прилагаемых к задаче файлов
     */
    public void addTask( long authorizationKey,	boolean isCompil,
            String sourcePath, String execPath, String attachedPaths[])
			throws RemoteException
    {
		long userID = networkTable.getID(authorizationKey);
		JTask newTask = new JTask(userID, isCompil, sourcePath, execPath, attachedPaths,4);
		//передать задачу в планировщик
        if(taskmanager.getMode()==IModeWork.AUTONOMIC_MODE){
            taskmanager.getLocalTM().addTask(newTask);
            taskmanager.getLocalTM().activateNextTask(); // ЗАГЛУШКА
        }
        else if(taskmanager.getMode()==IModeWork.ARBITRATOR_MODE)
            taskmanager.getGlobalTM().addTask(newTask);
	}

    /**
     * Удаление задачи из системы.
     * Если задача активна, выполнение прекращается и задача удаляется.
     * @param authorizationKey  пользователя, который пытается удалить задачу.
	 * @param taskID id задачи для удаления.
     * @return true в случае успеха, false - задачи нет в системе или у
	 * пользователя нет прав для удаления задачи.
     */

    public boolean deleteTask(long	authorizationKey, long taskID)
			throws RemoteException
	{
		long userID = networkTable.getID(authorizationKey);
		if(containsTask(userID, taskID) == true)
		{
			// <!TODO> Удаление задачи.
		}
		return false;
	}

    /**
     * Проверить наличие задачи в системе и соответствие задачи пльзователю.
	 * @param authorizationKey ключ авторизации. пользователя
	 * @param taskID id задачи для удаления.
     * @return true если задача присутствует в системе.
     */
    public boolean containsTask(long authorizationKey, long taskID)
			throws RemoteException
	{
		long userID = networkTable.getID(authorizationKey);
		// <!TODO> поиск задачи.
		return false;
	}
	// -Добавлено 02.04.09, TrueWar (id 2009)-----------------------------------
}
